package com.me.singleton;

/**
 * @author inttom
 * @date 2022/2/12
 *
 * 静态代码块和静态变量类似,只不过将类的实例化的过程放在了静态代码块中,也是在类加载的时候,就执行静态代码块中的代码,初始化类的实例,优缺点和上面是一样的
 * 结论:这种单例模式可用,但是可能造成内存浪费
 */
public class SingletonTest02 {
    public static void main(String[] args) {
        Singleton2 instance = Singleton2.getInstance();
        Singleton2 instance2 = Singleton2.getInstance();

        // true
        System.out.println(instance == instance2);
        System.out.println(instance.hashCode());
        System.out.println(instance2.hashCode());

    }
}

/**
 * 饿汉式(静态代码块)
 */
class Singleton2 {
    /**
     * 构造器私有化,外部不能new
     */
    private Singleton2() {
    }

    /**
     * 本类内部创建对象实例
     */
    private static Singleton2 instance;

    static { // 在静态代码块中,创建单例对象
        instance = new Singleton2();
    }

    /**
     * 提供一个公有的静态方法,返回实例对象
     *
     * @return 实例对象
     */
    public static Singleton2 getInstance() {
        return instance;
    }
}

